// 击鼓传花的规则是：有 n 个人围成一圈，从第一个人开始报数，数到 m 的人出局，然后从下一个人重新开始报数，数到 m 的人再出局，直到剩下最后一个人为止。
// 利用循环队列 可以实现击鼓传花的游戏。
// 循环队列是一种特殊的队列，当队列中的元素个数达到队列的最大容量时，再往队列中添加元素，会覆盖掉队列中最早添加的元素。
class Queue {
  constructor () {
    this.items = []
  }
  // 入队
  enqueue (item) {
    this.items.push(item)
  }
  // 出队
  dequeue () {
    return this.items.shift()
  }
  // 查看队列长度
  size () {
    return this.items.length
  }
  // 检查队列是否为空
  isEmpty () {
    return this.items.length === 0
  }
  // 清空队列
  clear () {
    this.items = []
  }
  // 查看队头元素
  front () {
    return this.items[0]
  }
  // 将队列的元素以字符串形式返回
  toString () {
    let result = ''
    for (let i = 0; i < this.items.length; i++) {
      result += this.items[i] + ''
    }
    return result
  }
}
const queue = new Queue()
queue.enqueue(1)
queue.enqueue(5)
queue.enqueue(2)
queue.enqueue(3)
console.log(queue);
console.log(queue.dequeue());
console.log(queue);
/**
 * 
 * @param {*} numberList 玩游戏的人数 
 * @param {*} number 数的数
 */
function passGame (numberList, number) {
  const queue = new Queue()
  for (let item of numberList) {
    queue.enqueue(item)
  }
  // 开始数数
  while (queue.size() > 1) {
    for (let i = 0; i < number - 1; i++) {
      // 将前一个重新入队
      queue.enqueue(queue.dequeue())
    }
    queue.dequeue()
    return queue.front()
  }
}
console.log(passGame([1, 2, 3, 4, 5], 2));